package com.childenglish.controller;

import com.childenglish.service.FileStorageService;
import com.childenglish.utils.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

/**
 * 个性化指导控制器
 * 处理教师为学生撰写的个性化指导内容
 */
@RestController
@RequestMapping("/api/guidance")
public class GuidanceController {

    private static final Logger logger = LoggerFactory.getLogger(GuidanceController.class);

    @Autowired
    private FileStorageService fileStorageService;

    /**
     * 上传语音文件（用于插入到指导内容中）
     */
    @PostMapping("/upload-audio")
    public R<Map<String, Object>> uploadAudio(@RequestParam("audio") MultipartFile audioFile) {
        try {
            logger.info("收到语音上传请求: fileName={}, size={} bytes, contentType={}",
                    audioFile != null ? audioFile.getOriginalFilename() : "null",
                    audioFile != null ? audioFile.getSize() : 0,
                    audioFile != null ? audioFile.getContentType() : "null");

            if (audioFile == null || audioFile.isEmpty()) {
                logger.warn("语音上传失败: 文件为空");
                return R.<Map<String, Object>>error("音频文件不能为空");
            }

            // 验证文件类型（支持带参数的MIME类型，如 audio/webm; codecs=opus）
            String contentType = audioFile.getContentType();
            if (contentType != null) {
                // 提取基础MIME类型（去掉参数部分）
                String baseContentType = contentType.split(";")[0].trim().toLowerCase();
                if (!baseContentType.startsWith("audio/")) {
                    logger.warn("语音上传失败: 不支持的文件类型 {}", contentType);
                    return R.<Map<String, Object>>error("不支持的文件类型，请上传音频文件");
                }
            } else {
                // 如果contentType为null，检查文件扩展名
                String fileName = audioFile.getOriginalFilename();
                if (fileName != null) {
                    String ext = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
                    if (!ext.matches("webm|ogg|mp3|wav|mp4|m4a")) {
                        logger.warn("语音上传失败: 不支持的文件扩展名 {}", ext);
                        return R.<Map<String, Object>>error("不支持的文件类型，请上传音频文件");
                    }
                }
            }

            // 验证文件大小（限制为10MB）
            long maxSize = 10 * 1024 * 1024; // 10MB
            if (audioFile.getSize() > maxSize) {
                logger.warn("语音上传失败: 文件大小超过限制 {} bytes", audioFile.getSize());
                return R.<Map<String, Object>>error("音频文件大小不能超过10MB");
            }

            // 保存文件
            String fileName = fileStorageService.storeFile(audioFile);

            // 构建文件访问URL
            String fileUrl = "/file/download/" + fileName;

            Map<String, Object> result = new HashMap<>();
            result.put("fileName", fileName);
            result.put("originalName", audioFile.getOriginalFilename());
            result.put("url", fileUrl);
            result.put("fileUrl", fileUrl);
            result.put("downloadUrl", fileUrl);
            result.put("size", audioFile.getSize());
            result.put("contentType", audioFile.getContentType());
            result.put("uploadTime", System.currentTimeMillis());

            logger.info("语音上传成功: originalName={}, savedFileName={}, size={} bytes",
                    audioFile.getOriginalFilename(), fileName, audioFile.getSize());

            return R.<Map<String, Object>>ok("语音上传成功").data(result);

        } catch (Exception e) {
            logger.error("语音上传失败", e);
            return R.<Map<String, Object>>error("语音上传失败: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()));
        }
    }

    /**
     * 上传课件文件（用于插入到指导内容中）
     */
    @PostMapping("/upload-courseware")
    public R<Map<String, Object>> uploadCourseware(@RequestParam("file") MultipartFile file) {
        try {
            logger.info("收到课件上传请求: fileName={}, size={} bytes, contentType={}",
                    file != null ? file.getOriginalFilename() : "null",
                    file != null ? file.getSize() : 0,
                    file != null ? file.getContentType() : "null");

            if (file == null || file.isEmpty()) {
                logger.warn("课件上传失败: 文件为空");
                return R.<Map<String, Object>>error("文件不能为空");
            }

            // 验证文件大小（限制为100MB）
            long maxSize = 100 * 1024 * 1024; // 100MB
            if (file.getSize() > maxSize) {
                logger.warn("课件上传失败: 文件大小超过限制 {} bytes", file.getSize());
                return R.<Map<String, Object>>error("文件大小不能超过100MB");
            }

            // 保存文件
            String fileName = fileStorageService.storeFile(file);

            // 构建文件访问URL
            String fileUrl = "/file/download/" + fileName;

            Map<String, Object> result = new HashMap<>();
            result.put("fileName", fileName);
            result.put("originalName", file.getOriginalFilename());
            result.put("url", fileUrl);
            result.put("fileUrl", fileUrl);
            result.put("downloadUrl", fileUrl);
            result.put("size", file.getSize());
            result.put("contentType", file.getContentType());
            result.put("uploadTime", System.currentTimeMillis());

            logger.info("课件上传成功: originalName={}, savedFileName={}, size={} bytes",
                    file.getOriginalFilename(), fileName, file.getSize());

            return R.<Map<String, Object>>ok("课件上传成功").data(result);

        } catch (Exception e) {
            logger.error("课件上传失败", e);
            return R.<Map<String, Object>>error("课件上传失败: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()));
        }
    }

    /**
     * 保存指导内容
     */
    @PostMapping("/save")
    public R<Map<String, Object>> saveGuidance(@RequestBody Map<String, Object> guidanceData) {
        try {
            logger.info("收到保存指导请求: {}", guidanceData);

            // TODO: 这里可以保存到数据库
            // 目前先返回成功，实际项目中需要：
            // 1. 创建Guidance实体类
            // 2. 创建GuidanceMapper
            // 3. 保存到数据库

            Map<String, Object> result = new HashMap<>();
            result.put("guidanceId", System.currentTimeMillis()); // 临时ID
            result.put("savedTime", System.currentTimeMillis());

            return R.<Map<String, Object>>ok("指导内容保存成功").data(result);

        } catch (Exception e) {
            logger.error("保存指导失败", e);
            return R.<Map<String, Object>>error("保存指导失败: " + e.getMessage());
        }
    }

    /**
     * 发送指导内容
     */
    @PostMapping("/send")
    public R<Map<String, Object>> sendGuidance(@RequestBody Map<String, Object> guidanceData) {
        try {
            logger.info("收到发送指导请求: {}", guidanceData);

            // TODO: 这里可以发送通知给学生或家长
            // 目前先返回成功，实际项目中需要：
            // 1. 保存指导内容到数据库
            // 2. 发送通知（站内消息、邮件、短信等）

            Map<String, Object> result = new HashMap<>();
            result.put("guidanceId", System.currentTimeMillis()); // 临时ID
            result.put("sentTime", System.currentTimeMillis());
            result.put("status", "sent");

            return R.<Map<String, Object>>ok("指导内容发送成功").data(result);

        } catch (Exception e) {
            logger.error("发送指导失败", e);
            return R.<Map<String, Object>>error("发送指导失败: " + e.getMessage());
        }
    }
}

